Queue একটি অর্ডারড ডাটা স্ট্রাকচার যা FIFO (First In First Out) প্রিন্সিপলে কাজ করে, অর্থাৎ যে ডেটা প্রথমে আসে সেটিই প্রথমে বের হয়। এটি একটি line এর মতো কাজ করে, যেখানে এলিমেন্টগুলি একদিকে ইনপুট করা হয় (enqueue) এবং অন্যদিকে আউটপুট করা হয় (dequeue)। ডাটা স্ট্রাকচার হিসেবে Queue অনেক গুরুত্বপূর্ণ, বিশেষত যখন কোনো ডাটা প্রক্রিয়া সিরিয়াল আকারে সম্পন্ন করতে হয়।
এখানে আমরা Queue এর ধারণা এবং এর প্রধান প্রকারভেদ—Simple Queue এবং Circular Queue নিয়ে আলোচনা করব।
1. Queue এর মৌলিক ধারণা
Queue এমন একটি ডাটা স্ট্রাকচার যেখানে ইনপুট এবং আউটপুট দুটি আলাদা অপারেশন থাকে:
- Enqueue: নতুন এলিমেন্ট যোগ করা।
- Dequeue: প্রথমে থাকা এলিমেন্ট সরিয়ে ফেলা।
Queue এর মৌলিক অপারেশন:
- enqueue(x): x মানের একটি নতুন এলিমেন্ট যুক্ত করা।
- dequeue(): প্রথমে থাকা এলিমেন্ট সরিয়ে ফেলা।
- peek(): প্রথম এলিমেন্ট দেখার জন্য (কিন্তু সরানো হয় না)।
- isEmpty(): Queue খালি কিনা চেক করা।
- isFull(): Queue পূর্ণ কিনা চেক করা।
Queue এর প্রক্রিয়া খুবই সহজ, এবং এটি সিস্টেমের বিভিন্ন কাজের জন্য ব্যবহৃত হয়, যেমন ব্যাঙ্কের লাইন, অ্যাপ্লিকেশন প্রোগ্রামিং এবং পাইপলাইন ম্যানেজমেন্ট।
2. Simple Queue
Simple Queue হলো একটি সাধারণ Queue যেখানে ইনপুট এলিমেন্ট একদিকে দেওয়া হয় এবং আউটপুট এলিমেন্ট অন্যদিকে পাওয়া যায়। Simple Queue তে প্রথম এলিমেন্ট প্রথমে (FIFO) বের হয়। এটি সাধারণত একটি লিনিয়ার Queue হয়, যেখানে একমাত্র পয়েন্টার (pointer) থাকে।
Simple Queue এর স্ট্রাকচার:
Front -> [Data] -> [Data] -> [Data] -> Rear
এখানে Front হলো Queue এর প্রথম অংশ এবং Rear হলো Queue এর শেষ অংশ।
Simple Queue এর অপারেশন
উদাহরণ: Simple Queue
class Queue {
int maxSize;
int front;
int rear;
int[] queue;
// Queue Constructor
public Queue(int size) {
maxSize = size;
queue = new int[maxSize];
front = -1;
rear = -1;
}
// Enqueue Operation
public void enqueue(int value) {
if (rear == maxSize - 1) {
System.out.println("Queue is Full");
} else {
if (front == -1) front = 0;
rear++;
queue[rear] = value;
System.out.println(value + " enqueued");
}
}
// Dequeue Operation
public void dequeue() {
if (front == -1 || front > rear) {
System.out.println("Queue is Empty");
} else {
System.out.println(queue[front] + " dequeued");
front++;
}
}
// Peek Operation
public void peek() {
if (front == -1 || front > rear) {
System.out.println("Queue is Empty");
} else {
System.out.println("Front Element: " + queue[front]);
}
}
// Check if Queue is Empty
public boolean isEmpty() {
return (front == -1 || front > rear);
}
}
public class SimpleQueueExample {
public static void main(String[] args) {
Queue q = new Queue(5);
// Enqueue some elements
q.enqueue(10);
q.enqueue(20);
q.enqueue(30);
// Peek the front element
q.peek();
// Dequeue an element
q.dequeue();
// Check if Queue is empty
System.out.println("Is Queue Empty: " + q.isEmpty());
}
}
ব্যাখ্যা:
- Enqueue:
enqueue()মেথডে নতুন এলিমেন্ট যোগ করা হয়। - Dequeue:
dequeue()মেথডে প্রথম এলিমেন্ট সরানো হয়। - Peek:
peek()মেথডে প্রথম এলিমেন্ট দেখা যায়, কিন্তু সরানো হয় না। - isEmpty:
isEmpty()মেথডে Queue খালি কিনা তা চেক করা হয়।
3. Circular Queue
Circular Queue হলো এমন একটি Queue যেখানে rear এবং front পয়েন্টার একই জায়গায় মিলিত হতে পারে। এতে Queue শেষ হওয়ার পরও ডেটা জায়গা নিয়ে পুনরায় ফিরে আসে। অর্থাৎ, যখন queue এর rear পয়েন্টার শেষে চলে যায়, তখন সেটি আবার প্রথম দিকে ফিরে যায় এবং নতুন এলিমেন্ট অ্যাড করতে পারে। এটি সাধারণভাবে একরকম সার্কুলার (চক্রাকার) স্ট্রাকচার হয়।
Circular Queue এর স্ট্রাকচার:
Front -> [Data] -> [Data] -> [Data] -> Rear
(Circular Connection)
এখানে Front হলো Queue এর প্রথম অংশ এবং Rear হলো Queue এর শেষ অংশ, এবং rear যখন শেষের দিকে চলে আসে তখন এটি আবার প্রথম দিকে ফিরে আসে।
Circular Queue এর অপারেশন
উদাহরণ: Circular Queue
class CircularQueue {
int maxSize;
int front;
int rear;
int[] queue;
// Constructor
public CircularQueue(int size) {
maxSize = size;
queue = new int[maxSize];
front = -1;
rear = -1;
}
// Enqueue Operation
public void enqueue(int value) {
if ((rear + 1) % maxSize == front) {
System.out.println("Queue is Full");
} else {
if (front == -1) front = 0;
rear = (rear + 1) % maxSize;
queue[rear] = value;
System.out.println(value + " enqueued");
}
}
// Dequeue Operation
public void dequeue() {
if (front == -1) {
System.out.println("Queue is Empty");
} else {
System.out.println(queue[front] + " dequeued");
if (front == rear) {
front = rear = -1;
} else {
front = (front + 1) % maxSize;
}
}
}
// Peek Operation
public void peek() {
if (front == -1) {
System.out.println("Queue is Empty");
} else {
System.out.println("Front Element: " + queue[front]);
}
}
// Check if Queue is Empty
public boolean isEmpty() {
return (front == -1);
}
}
public class CircularQueueExample {
public static void main(String[] args) {
CircularQueue q = new CircularQueue(5);
// Enqueue some elements
q.enqueue(10);
q.enqueue(20);
q.enqueue(30);
// Peek the front element
q.peek();
// Dequeue an element
q.dequeue();
// Check if Queue is empty
System.out.println("Is Queue Empty: " + q.isEmpty());
}
}
ব্যাখ্যা:
- Circular Queue:
enqueue()এবংdequeue()মেথডে Circular Queue-এর মূল ধারণা ব্যবহৃত হয়েছে, যেখানে rear এবং front পয়েন্টার চক্রাকারে চলতে থাকে। - Rear Pointer: rear পয়েন্টারকে
(rear + 1) % maxSizeব্যবহার করে চক্রাকারভাবে বাড়ানো হয়েছে, যাতে এটি শেষ হওয়ার পর আবার প্রথম দিকে ফিরে আসে।
4. Queue এর সুবিধা ও ব্যবহার
সুবিধা:
- FIFO (First In First Out): Queue এর মাধ্যমে আপনি সিস্টেমের কার্যক্রম FIFO ভিত্তিতে পরিচালনা করতে পারেন।
- ডাইনামিক মেমরি ব্যবস্থাপনা: Queue ডাইনামিকভাবে মেমরি ব্যবস্থাপনা করতে সহায়ক, বিশেষত যখন ডাটা প্রক্রিয়াকরণে প্রয়োজন হয়।
ব্যবহার:
- Process Scheduling: অপারেটিং সিস্টেমে টাস্ক বা প্রক্রিয়া সাজানোর জন্য Queue ব্যবহার করা হয়।
- Message Queues: মেসেজ প্রক্রিয়া এবং পাঠানোর জন্য Queue ব্যবহৃত হয়।
- Printer Queue: প্রিন্টার কাজের জন্য Queue ব্যবহার করা হয়।
- Data Buffering: ডাটা স্টোরেজ এবং ট্রান্সফার কাজে Queue ব্যবহৃত হয়।
Queue একটি গুরুত্বপূর্ণ ডাটা স্ট্রাকচার যা FIFO (First In First Out) প্রিন্সিপল অনুসরণ করে। Simple Queue এবং Circular Queue হল এর দুই প্রাথমিক ধরনের। Queue দিয়ে আপনি বিভিন্ন কাজ যেমন প্রক্রিয়া সিডিউলিং, মেসেজ ট্রান্সফার, ডাটা স্টোরেজ ইত্যাদি কার্যকরীভাবে করতে পারেন। Java দিয়ে Queue তৈরি এবং ব্যবহারের মাধ্যমে আপনি ডাটা স্ট্রাকচার এবং অ্যালগরিদমের ভিত্তি শক্তিশালী করতে পারবেন।
Read more